package com.linyaonan.leetcode.medium._1695;

import java.util.HashMap;

/**
 *
 * 给你一个正整数数组 nums ，请你从中删除一个含有 若干不同元素 的子数组。删除子数组的 得分 就是子数组各元素之 和 。
 *
 * 返回 只删除一个 子数组可获得的 最大得分 。
 *
 * 如果数组 b 是数组 a 的一个连续子序列，即如果它等于 a[l],a[l+1],...,a[r] ，那么它就是 a 的一个子数组。
 *
 *
 *
 * 示例 1：
 *
 * 输入：nums = [4,2,4,5,6]
 * 输出：17
 * 解释：最优子数组是 [2,4,5,6]
 * 示例 2：
 *
 * 输入：nums = [5,2,1,2,5,2,1,2,5]
 * 输出：8
 * 解释：最优子数组是 [5,2,1] 或 [1,2,5]
 *
 *
 * 提示：
 *
 * 1 <= nums.length <= 10^5
 * 1 <= nums[i] <= 10^4
 *
 * @author: Lin
 * @date: 2024/10/29
 */
public class MaximumErasureValue {

    /**
     * 从题目可以发现依然是不重复子数组的最大值问题
     * 不定长滑动窗口
     * @param nums
     * @return
     */
    public int maximumUniqueSubarray(int[] nums) {
        int l = 0;
        int r = 0;

        HashMap<Integer, Integer> saved = new HashMap<>();
        int result = 0;
        int add = 0;
        while (l <= r && r < nums.length) {
            int current = nums[r];
            while (saved.containsKey(current)) {
                int pre = nums[l];
                if (saved.merge(pre, -1, Integer::sum) == 0) {
                    saved.remove(pre);
                }
                add -= nums[l];
                l++;
            }
            saved.merge(current, 1, Integer::sum);
            add += nums[r];
            r++;

            result = Math.max(result, add);
        }

        return result;

    }

}
